package com.clf.data.redis.core.json.ops.impl;

import com.clf.data.redis.core.json.FastJsonRedisTemplate;
import com.clf.data.redis.core.json.ops.FastJsonZSetOperations;
import org.springframework.data.redis.connection.RedisZSetCommands.Limit;
import org.springframework.data.redis.connection.RedisZSetCommands.Range;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.Collection;
import java.util.Set;

/**
 * ops覆盖类，可提供原先ops没有的方法
* @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
* @version 
* @since JDK 1.6
* create on 2017年3月31日
* Copyright 2017 ZZJR All Rights Reserved.
*
*/
public class FastJsonZSetOperationsImpl<K,V> extends OperationsAware<K, V> implements FastJsonZSetOperations<K,V> {
	private ZSetOperations<K,V> ops;
	public FastJsonZSetOperationsImpl(ZSetOperations<K,V> ops, FastJsonRedisTemplate<K,V> template){
		super(template);
		this.ops = ops;
	}
	/**
	 * 添加值
	 */
	@Override
	public Boolean add(K key, V value, double score) {
		// TODO Auto-generated method stub
		return ops.add(key, value, score);
	}
	/**
	 * 添加多个值
	 */
	@Override
	public Long add(K key, Set<ZSetOperations.TypedTuple<V>> tuples) {
		// TODO Auto-generated method stub
		return ops.add(key, tuples);
	}
	/**
	 * 删除多个值
	 */
	@Override
	public Long remove(K key, Object... values) {
		// TODO Auto-generated method stub
		return ops.remove(key, values);
	}
	/**
	 * 添加单位成员的有序集合存储增量键比分
	 */
	@Override
	public Double incrementScore(K key, V value, double delta) {
		// TODO Auto-generated method stub
		return ops.incrementScore(key, value, delta);
	}
	/**
	 * 返回成员的有序集合保存在key，由低到高的分数顺序排名
	 */
	@Override
	public Long rank(K key, Object o) {
		// TODO Auto-generated method stub
		return ops.rank(key, o);
	}
	/**
	 * 返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序
	 */
	@Override
	public Long reverseRank(K key, Object o) {
		// TODO Auto-generated method stub
		return ops.reverseRank(key, o);
	}
	/**
	 * 取有序集中第start位到end位的元素
	 */
	@Override
	public Set<V> range(K key, long start, long end) {
		// TODO Auto-generated method stub
		return ops.range(key, start, end);
	}
	/**
	 * 取有序集中第start位到end位的元素，返回TypedTuple，包含score
	 */
	@Override
	public Set<ZSetOperations.TypedTuple<V>> rangeWithScores(K key, long start,
			long end) {
		// TODO Auto-generated method stub
		return ops.rangeWithScores(key, start, end);
	}
	/**
	 * 取有序集中分数为min到max的元素
	 */
	@Override
	public Set<V> rangeByScore(K key, double min, double max) {
		// TODO Auto-generated method stub
		return ops.rangeByScore(key, min, max);
	}
	/**
	 * 取有序集中分数为min到max的元素，返回TypedTuple，包含score
	 */
	@Override
	public Set<ZSetOperations.TypedTuple<V>> rangeByScoreWithScores(K key,
			double min, double max) {
		// TODO Auto-generated method stub
		return ops.rangeByScoreWithScores(key, min, max);
	}
	/**
	 * 取有序集中分数为min到max的元素
	 */
	@Override
	public Set<V> rangeByScore(K key, double min, double max, long offset, long count) {
		// TODO Auto-generated method stub
		return ops.rangeByScore(key, min, max, offset, count);
	}
	/**
	 * 取有序集中分数为min到max的元素，返回TypedTuple，包含score
	 */
	@Override
	public Set<ZSetOperations.TypedTuple<V>> rangeByScoreWithScores(K key,
			double min, double max, long offset, long count) {
		// TODO Auto-generated method stub
		return ops.rangeByScoreWithScores(key, min, max, offset, count);
	}
	/**
	 * 对start到end的元素进行倒序，并返回
	 */
	@Override
	public Set<V> reverseRange(K key, long start, long end) {
		// TODO Auto-generated method stub
		return ops.reverseRange(key, start, end);
	}
	/**
	 * 对start到end的元素进行倒序，并返回TypedTuple，包含score
	 */
	@Override
	public Set<ZSetOperations.TypedTuple<V>> reverseRangeWithScores(K key,
			long start, long end) {
		// TODO Auto-generated method stub
		return ops.reverseRangeWithScores(key, start, end);
	}
	/**
	 * 对分数为min到max的元素进行倒序
	 */
	@Override
	public Set<V> reverseRangeByScore(K key, double min, double max) {
		// TODO Auto-generated method stub
		return ops.reverseRangeByScore(key, min, max);
	}
	/**
	 * 对分数为min到max的元素进行倒序，并返回TypedTuple，包含score
	 */
	@Override
	public Set<ZSetOperations.TypedTuple<V>> reverseRangeByScoreWithScores(K key,
			double min, double max) {
		// TODO Auto-generated method stub
		return ops.reverseRangeByScoreWithScores(key, min, max);
	}
	/**
	 * 对分数为min到max的元素进行倒序
	 */
	@Override
	public Set<V> reverseRangeByScore(K key, double min, double max, long offset, long count) {
		// TODO Auto-generated method stub
		return ops.reverseRangeByScore(key, min, max, offset, count);
	}
	/**
	 * 对分数为min到max的元素进行倒序，并返回TypedTuple，包含score
	 */
	@Override
	public Set<ZSetOperations.TypedTuple<V>> reverseRangeByScoreWithScores(K key,
			double min, double max, long offset, long count) {
		// TODO Auto-generated method stub
		return ops.reverseRangeByScoreWithScores(key, min, max, offset, count);
	}
	/**
	 * 统计分数值在min到max范围内的元素个数
	 */
	@Override
	public Long count(K key, double min, double max) {
		// TODO Auto-generated method stub
		return ops.count(key, min, max);
	}
	/**
	 * 元素个数
	 */
	@Override
	public Long size(K key) {
		// TODO Auto-generated method stub
		return ops.size(key);
	}
	/**
	 * 元素个数
	 */
	@Override
	public Long zCard(K key) {
		// TODO Auto-generated method stub
		return ops.zCard(key);
	}
	/**
	 * 指定元素的分数
	 */
	@Override
	public Double score(K key, Object o) {
		// TODO Auto-generated method stub
		return ops.score(key, o);
	}
	/**
	 *删除下标start到end的元素
	 */
	@Override
	public Long removeRange(K key, long start, long end) {
		// TODO Auto-generated method stub
		return ops.removeRange(key, start, end);
	}
	/**
	 *删除分数min到max的元素
	 */
	@Override
	public Long removeRangeByScore(K key, double min, double max) {
		// TODO Auto-generated method stub
		return ops.removeRangeByScore(key, min, max);
	}
	/**
	 * 并集，如果destkey存在，则覆盖
	 */
	@Override
	public Long unionAndStore(K key, K otherKey, K destKey) {
		// TODO Auto-generated method stub
		return ops.unionAndStore(key, otherKey, destKey);
	}
	/**
	 * 并集，如果destkey存在，则覆盖
	 */
	@Override
	public Long unionAndStore(K key, Collection<K> otherKeys, K destKey) {
		// TODO Auto-generated method stub
		return ops.unionAndStore(key, otherKeys, destKey);
	}
	/**
	 *  交集，如果destkey存在，则覆盖
	 */
	@Override
	public Long intersectAndStore(K key, K otherKey, K destKey) {
		// TODO Auto-generated method stub
		return ops.intersectAndStore(key, otherKey, destKey);
	}
	/**
	 *  交集，如果destkey存在，则覆盖
	 */
	@Override
	public Long intersectAndStore(K key, Collection<K> otherKeys, K destKey) {
		// TODO Auto-generated method stub
		return ops.intersectAndStore(key, otherKeys, destKey);
	}

	@Override
	public Cursor<ZSetOperations.TypedTuple<V>> scan(K key, ScanOptions options) {
		// TODO Auto-generated method stub
		return ops.scan(key, options);
	}
	/**
	 * 返回存储在键的排序集合在指定的范围元素。该元素被认为是从最低到最高的分值进行排序。字典顺序用于以相等的分数的元素。两个开始和结束是从零开始的索引，其中0是第一个元素，1是下一个元素等等。它们也可以是表示偏移量从有序集的结尾，以-1作为排序的集合的最后一个元素，-2倒数第二元素等负数	
	 */
	@Override
	public Set<V> rangeByLex(K key, Range range) {
		// TODO Auto-generated method stub
		return ops.rangeByLex(key, range);
	}
	/**
	 * 返回存储在键的排序集合在指定的范围元素。该元素被认为是从最低到最高的分值进行排序。字典顺序用于以相等的分数的元素。两个开始和结束是从零开始的索引，其中0是第一个元素，1是下一个元素等等。它们也可以是表示偏移量从有序集的结尾，以-1作为排序的集合的最后一个元素，-2倒数第二元素等负数	
	 */
	@Override
	public Set<V> rangeByLex(K key, Range range, Limit limit) {
		// TODO Auto-generated method stub
		return ops.rangeByLex(key, range,limit);
	}


}
